#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "entree.h"


entree* creerEntree(char* nouvelId, definition* def) 
{
	entree* e = (entree*)malloc(sizeof(entree));
	e -> lexeme = strdup(nouvelId);
	piledef* pdef = (piledef*)malloc(sizeof(piledef));
	pdef -> tete = def;
	pdef -> next = NULL;
	e -> definitioncourante = pdef;
   	e -> suivantTS = NULL;
	return e;
}

entree* creerEntreeBidon(typage type)
{
	//printf("creerEntreeBidon\n");
	entree* e = (entree*)malloc(sizeof(entree));
	e -> lexeme = "bidon";
	
    int registreBidon = -1;
    prop* proprietes = creerPropriete(type, NULL,-1000);//type, params, registre
	definition* def = creerDefinition(-1, proprietes);//niveau proprietes
	
	piledef* pdef = (piledef*)malloc(sizeof(piledef));
	pdef -> tete = def;
	e -> definitioncourante = pdef;
   	e -> suivantTS = NULL;
	return e;	
}

entree* supprimerEntree(entree* e)
{
		if (e)
		{						
			free(e->lexeme);
			e->lexeme = NULL;
			e->definitioncourante = supprimerPileDef(e->definitioncourante);
			free(e);
			e = NULL;
		} 
		//else fprintf(stderr, "pointeur null entree* e\n" );
	return e;
}

// ajoute une definition à la pile de definitions d'une entree
entree* addDefinition(int bloc, entree* e, typage t, param* liste, int reg)
{

    //int level = getLevel(e) + 1;
    //MODIF : le level sera celui du bloc
    int level = bloc;
    //printf("ADDdefinition getLevel: %i level(+1) : %i \n", getLevel(e), level);
    prop* p = creerPropriete(t, liste, reg) ;
	definition* def = creerDefinition(level, p);
	piledef* pile = e->definitioncourante;
    pile = pushPileDef(pile,def);
	e->definitioncourante = pile;
	
	
	return e;
}
